iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
0
Data Technology

GraphQL + ApolloData 入門系列 第 11

ApolloData & Query method (二)

  • 分享至 

  • xImage
  •  

介紹

承接上篇來介紹 ApolloData 使用 graphql hoc Query ,除了會撈到資料外 Apollo 會在 props 中多幾個 method ,接下來介紹 data.subscribeToMore(option):

透過 subscribeToMore 將啟動訂閱。Server上也設置訂閱才能正常工作。每當 Server 發送訂閱發佈時觸發更新

使用 subscribeToMore 函數會返回一個 unsubscribe 函數處理函數,可以有取消訂閱的功能。

通常的做法是在查詢完成後對在 componentWillReceiveProps 執行訂閱 subscribeToMore。 為了確保訂閱不是多次創建的,可以將其附加到組件實例。

option介紹 這邊跟一般 graphql 差不多 主要多了subscriptionData

document:文件是接受與創建 GraphQL 訂閱所需屬性graphql-tag的gql模板字符串標籤。它應該包含一個GraphQL訂閱操作,並返回將要返回的數據。

variables:變數改變就會到發fetch,變量要根據document的 gql 定義。

updateQuery:每次服務器發送更新時,都會運行的功能。這會修改HOC查詢的結果。第一個參數previousResult將是你在graphql()函數中定義的查詢所返回的之前的數據。第二個參數是一個有兩個屬性的對象。

subscriptionData: 訂閱的結果。

variables: 是與訂閱查詢一起使用的變量對象。使用這些參數,返回一個與graphql()函數中定義的GraphQL查詢形狀相同的新數據對象。這與fetchMore回調相似。或者,您可以使用reducer作為函數選項的一部分來更新查詢graphql()。

[onError]:一個可選的錯誤回調。

訂閱的結果更新查詢的 store (cache),必須在 subscribeToMore 中指定 updateQuery 選項,或者在 graphql 函數中指定 reducer 選項。


class SubscriptionComponent extends Component {
  componentWillReceiveProps(nextProps) {
    if(!nextProps.data.loading) {
      // Check for existing subscription
      if (this.unsubscribe) {
        // Check if props have changed and, if necessary, stop the subscription
        if (this.props.subscriptionParam !== nextProps.subscriptionParam) {
          this.unsubscribe();
        } else {
          return;
        }
      }

      // Subscribe
      this.unsubscribe = nextProps.data.subscribeToMore({
        document: gql`subscription {...}`,
        updateQuery: (previousResult, { subscriptionData, variables }) => {
          // Perform updates on previousResult with subscriptionData
          return updatedResult;
        }
      });
    }
  }
  render() {
    ...
  }
}

總結

ApolloData 也做了訂閱這機制,就像 Firebase 只要 Server 端有異動就可以直接讓客戶端接收到通知,接收通知在 componentWillReceiveProps 生命週期去做異動


上一篇
ApolloData & Query method (一)
下一篇
ApolloData & Query method (三)
系列文
GraphQL + ApolloData 入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言